<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of HtmlTag
 *
 * @author adriano.bonfiglio
 */
class HtmlTag {

    /**
     * Renvoie un Element HTML standard sous forme de chaine de caract�re
     *
     * @param string $tagName
     * @param mixed $content default false, si false autofermante
     * @param array $attributs attributs html de la balise
     * @return string
     */
    public static function tag($tagName, $content = false, $attributs = array()) {
        $selfClosing = ($content === false);
        $sReturn = '';
        if (is_array($attributs)) {
            $attributs = HtmlTag::toHtmlAttributs($attributs);
        }
        if (strlen($attributs)) {
            $attributs = ' ' . $attributs;
        }
        if ($selfClosing) {
            $sReturn = '<' . $tagName . $attributs . ' />';
        } else {
            $sReturn = '<' . $tagName . $attributs . '>' . $content . '</' . $tagName . '>';
        }
        return $sReturn;
    }

    /**
     * Formate un tableau d'attributs HTML en une chaine de caract�re
     * @example array('onclick'=>'alert('Hello !');') return "onclick="alert('Hello !');"
     *
     * @param array $attributs
     * @return string
     */
    public static function toHtmlAttributs($attributs) {
        $return = array();
        if (is_array($attributs) && count($attributs)) {
            foreach ($attributs as $attributName => $attributValue) {
                if (is_array($attributValue)) {
                    $attributValue = implode(' ', $attributValue);
                }
                if (is_int($attributName)) {
                    $return[] = $attributValue;
                } else {
                    $return[] = $attributName . '="' . $attributValue . '"';
                }
            }
        }
        return implode(' ', $return);
    }

    /**
     * Renvoi une balise HTML business ou standard standard.
     * Dans le premier cas, il s'agit d'une m�thod d�j� d�finie au sein de l'objet
     * Dans le second cas, le nom de la m�thod devient le nom du tag l'�lement HTML standard.
     *  UNIQUEMENT PHP 5.3
     * @param string $method_name
     * @param mixed $arguments
     * @return string
     */
    // METHODE GENERIQUE A UTILISER UNIQUEMENT EN PHP 5.3 : ELLE SE SUBSTITUE A TOUTES LES METHODES BALISE D'UN COUP
//    public static function __callStatic($method_name, $arguments) {
//
//        $classname = __CLASS__;
//        if (in_array($method_name, get_class_methods($classname)) && !in_array($method_name, array())) {
//
//            if (!is_array($arguments)) {
//                $arguments = array($arguments);
//            }
//            return call_user_func_array(array($classname, $method_name), $arguments);
//        } else {
//            return self::callFunctionStatic($method_name, $arguments);
//        }
//    }
//
//    public static function callFunctionStatic($method_name, $arguments) {
//        $classname = __CLASS__;
//
//        $content = false;
//        $attributs = array();
//
//        if (isset($arguments[1]) && is_array($arguments[1])) {
//            $attributs = $arguments[1];
//            $content = $arguments[0];
//        } elseif (isset($arguments[0])) {
//            if (is_array($arguments[0])) {
//                $attributs = $arguments[0];
//            } elseif (is_scalar($arguments[0]) && $arguments[0] !== true) {
//                $content = $arguments[0];
//            }
//        }
//        return call_user_func_array($classname . '::tag', array($method_name, $content, $attributs));
//    }

    /**
     * Renvoi un element select/option complet
     *
     * @param array $selectAttributs
     * @param array $optionsData
     * @param mixed $reference, la valeur selectionnee dans les options
     * @return string
     */
    public static function selectOption($selectAttributs, $optionsData, $reference = false) {
        $selectContent = '';
        if (!is_array($selectAttributs)) {
            $selectAttributs = array();
        }
        if (is_array($optionsData) && count($optionsData)) {
            foreach ($optionsData as $value) {
                $text = '';
                if (is_array($value)) {
                    $attributs = $value;
                    $text = isset($attributs['text']) ? $attributs['text'] : $text;
                    unset($attributs['text']);
                } else {
                    $attributs = array('value' => $value);
                    $text = $value;
                }

                if (isset($attributs['value']) && $attributs['value'] == $reference && $reference !== false) {
                    $attributs['selected'] = 'selected';
                }
                $selectContent .= HtmlTag::option($text, $attributs);
            }
        }
        $html = HtmlTag::select($selectContent, $selectAttributs);
        return $html;
    }

    /**
     * Renvoi un element business pour obliger un retour � la ligne
     *
     * @return string
     */
    public static function breaker() {
        return HtmlTag::br(array('class' => 'breaker'));
    }

    /**
     * Transforme un tableau PHP en une table HTML
     *
     * @param type $aElements
     * @param type $aTableAttributs
     * @return type
     */
    public static function elementsToTable($aElements, $aTableAttributs = array(), $headElements = array()) {
        $sTable = $sTr = '';
        $sClassCol = 'col';
        $sClassRow = 'row';
        if (is_array($headElements) && count($headElements)) {
            $sTr = '';
            $j = 0;
            foreach ($headElements as $sCel) {
                $aColAttr = array('class' => array($sClassCol . $j));
                $sCel = (strlen($sCel) == 0 || is_null($sCel)) ? '&nbsp;' : $sCel;
                $sTr .= HtmlTag::th($sCel, $aColAttr);
                $j++;
            }
            $sTable .= HtmlTag::thead(HtmlTag::tr($sTr));
        }
        if (is_array($aElements) && count($aElements)) {
            $i = $j = 0;
            foreach ($aElements as $aLine) {
                $aRowAttr = array('class' => array($sClassRow . $i));
                $sTr = '';
                if (is_array($aLine) && count($aLine)) {
                    $j = 0;
                    foreach ($aLine as $sCel) {
                        $aColAttr = array('class' => array($sClassCol . $j));
                        $sCel = (strlen($sCel) == 0 || is_null($sCel)) ? '&nbsp;' : $sCel;
                        $sTr .= HtmlTag::td($sCel, $aColAttr);
                        $j++;
                    }
                }
                $sTable .= HtmlTag::tr($sTr, $aRowAttr);
                $i++;
            }
        }
        return HtmlTag::table($sTable, $aTableAttributs);
    }

    public static function addClassAttributs($class, $attributs) {
        $attributs = self::addPropertyAttributs('class', $class, $attributs);
        return $attributs;
    }

    public static function addPropertyAttributs($propertyName, $propertyValue, $attributs) {
        if (isset($attributs[$propertyName])) {
            if ($attributs[$propertyName] !== false) {
                if (is_array($attributs[$propertyName])) {
                    if (is_array($propertyValue)) {
                        $attributs[$propertyName] = array_merge($attributs[$propertyName], $propertyValue);
                    } else {
                        $attributs[$propertyName][] = $propertyValue;
                    }
                } else {
                    $attributs[$propertyName] = $propertyValue . '  ' . $attributs[$propertyName];
                }
            }
        } else {
            $attributs[$propertyName] = $propertyValue;
        }
        return $attributs;
    }

    public static function fakeimg($width, $height = false, $attributs = array(), $fgColor = false, $bgColor = false, $text = false) {
        $url = 'http://fakeimg.pl';
        $url .= '/' . (int) $width;
        if ($height) {
            $url .= 'x' . $height;
        }
        if ($fgColor) {
            $url .= '/' . $fgColor;
        }
        if ($bgColor) {
            $url .= '/' . $bgColor;
        }
        if ($text) {
            $url .= '?text=' . $text . '&font=lobster';
        } else {
            $url .= '?font=lobster';
        }
        $attributs['src'] = $url;
        return HtmlTag::tag('img', false, $attributs);
    }

    //A activer si PHP < 5.3
    public static function clear() {
        return HtmlTag::tag('div', '', array('style' => 'clear:both;'));
    }

    public static function tbody($content, $attributs = array()) {
        return HtmlTag::tag('tbody', $content, $attributs);
    }

    public static function optgroup($content, $attributs = array()) {
        return HtmlTag::tag('optgroup', $content, $attributs);
    }

    public static function th($content, $attributs = array()) {
        return HtmlTag::tag('th', $content, $attributs);
    }

    public static function tfooter($content, $attributs = array()) {
        return HtmlTag::tag('tfooter', $content, $attributs);
    }

    public static function thead($content, $attributs = array()) {
        return HtmlTag::tag('thead', $content, $attributs);
    }

    public static function textarea($content, $attributs = array()) {
        return HtmlTag::tag('textarea', $content, $attributs);
    }

    public static function footer($content, $attributs = array()) {
        return HtmlTag::tag('footer', $content, $attributs);
    }

    public static function iframe($content, $attributs = array()) {
        return HtmlTag::tag('iframe', $content, $attributs);
    }

    public static function section($content, $attributs = array()) {
        return HtmlTag::tag('section', $content, $attributs);
    }

    public static function small($content, $attributs = array()) {
        return HtmlTag::tag('small', $content, $attributs);
    }

    public static function center($content, $attributs = array()) {
        return HtmlTag::tag('center', $content, $attributs);
    }

    public static function h1($content, $attributs = array()) {
        return HtmlTag::tag('h1', $content, $attributs);
    }

    public static function h2($content, $attributs = array()) {
        return HtmlTag::tag('h2', $content, $attributs);
    }

    public static function h3($content, $attributs = array()) {
        return HtmlTag::tag('h3', $content, $attributs);
    }

    public static function h4($content, $attributs = array()) {
        return HtmlTag::tag('h4', $content, $attributs);
    }

    public static function h5($content, $attributs = array()) {
        return HtmlTag::tag('h5', $content, $attributs);
    }

    public static function pre($content, $attributs = array()) {
        return HtmlTag::tag('pre', $content, $attributs);
    }

    public static function head($content, $attributs = array()) {
        return HtmlTag::tag('head', $content, $attributs);
    }

    public static function span($content, $attributs = array()) {
        return HtmlTag::tag('span', $content, $attributs);
    }

    public static function i($content, $attributs = array()) {
        return HtmlTag::tag('i', $content, $attributs);
    }

    public static function p($content, $attributs = array()) {
        return HtmlTag::tag('p', $content, $attributs);
    }

    public static function body($content, $attributs = array()) {
        return HtmlTag::tag('body', $content, $attributs);
    }

    public static function form($content, $attributs = array()) {
        return HtmlTag::tag('form', $content, $attributs);
    }

    public static function button($content, $attributs = array()) {
        return HtmlTag::tag('button', $content, $attributs);
    }

    public static function html($content, $attributs = array()) {
        return HtmlTag::tag('html', $content, $attributs);
    }

    public static function meta($attributs = array()) {
        return HtmlTag::tag('meta', false, $attributs);
    }

    public static function img($attributs = array()) {
        return HtmlTag::tag('img', false, $attributs);
    }

    public static function a($content, $attributs = array()) {
        return HtmlTag::tag('a', $content, $attributs);
    }

    public static function div($content, $attributs = array()) {
        return HtmlTag::tag('div', $content, $attributs);
    }

    public static function title($content, $attributs = array()) {
        return HtmlTag::tag('title', $content, $attributs);
    }

    public static function script($content, $attributs = array()) {
        $attributs['type'] = 'text/javascript';
        return HtmlTag::tag('script', $content, $attributs);
    }

    public static function link($attributs = array()) {
        $attributs = array_merge(array('type'=>'text/css','rel'=>'stylesheet'),$attributs);
        return HtmlTag::tag('link', false, $attributs);
    }

    public static function style($content, $attributs = array()) {
        return HtmlTag::tag('style', $content, $attributs);
    }

    public static function strong($content, $attributs = array()) {
        return HtmlTag::tag('strong', $content, $attributs);
    }

    public static function em($content, $attributs = array()) {
        return HtmlTag::tag('em', $content, $attributs);
    }

    public static function legend($content, $attributs = array()) {
        return HtmlTag::tag('legend', $content, $attributs);
    }

    public static function li($content, $attributs = array()) {
        return HtmlTag::tag('li', $content, $attributs);
    }

    public static function ul($content, $attributs = array()) {
        return HtmlTag::tag('ul', $content, $attributs);
    }

    public static function caption($content, $attributs = array()) {
        return HtmlTag::tag('caption', $content, $attributs);
    }

    public static function fieldset($content, $attributs = array()) {
        return HtmlTag::tag('fieldset', $content, $attributs);
    }

    public static function tr($content, $attributs = array()) {
        return HtmlTag::tag('tr', $content, $attributs);
    }

    public static function td($content, $attributs = array()) {
        return HtmlTag::tag('td', $content, $attributs);
    }

    public static function table($content, $attributs = array()) {
        return HtmlTag::tag('table', $content, $attributs);
    }

    public static function label($content, $attributs = array()) {
        return HtmlTag::tag('label', $content, $attributs);
    }

    public static function hr($attributs = array()) {
        return HtmlTag::tag('hr', false, $attributs);
    }

    public static function br($attributs = array()) {
        return HtmlTag::tag('br', false, $attributs);
    }

    public static function input($attributs = array()) {
        return HtmlTag::tag('input', false, $attributs);
    }

    public static function select($content, $attributs = array()) {
        return HtmlTag::tag('select', $content, $attributs);
    }

    public static function option($content, $attributs = array()) {
        return HtmlTag::tag('option', $content, $attributs);
    }

}

?>
